Aller au contenu principal

Galaxy Engine

Au cœur de notre jeu se trouve un moteur physique personnalisé vraiment complexe et performant, conçu pour être facile à utiliser par nos level designers, et performant pour gérer des milliers d'attracteurs & gravitons même sur mobile !

Tout d'abord, voici un aperçu de notre carte Chill dans l'éditeur : alt text alt text

Il se passe beaucoup de choses, n'est-ce pas ? Si vous êtes curieux, voici le premier prototype du jeu :

alt text

Laissez-nous vous partager un peu de nos secrets sur le moteur, juste un peu !

Gravitons et Attracteurs

Nous avons 2 concepts : les gravitons sont des objets attirés par la gravité, et les attracteurs sont des objets qui peuvent attirer n'importe quel graviton. Au départ, nous avons essayé d'utiliser la formule basique de Newton, mais ça ne fonctionne pas... Attendez, qu'est-ce que j'ai dit ? Oui, ça fonctionne dans la vraie vie, mais pas dans les jeux ; pour des raisons de gameplay, avec de petits objets, ça ne marche pas très bien pour un platformer 3D rapide. Nous avons donc dû concevoir notre propre approche et tout faire nous-mêmes !

Dans cet exemple ci-dessous, 3 attracteurs attirent un seul graviton, la flèche blanche représente les forces de chaque attracteur, la flèche verte la force combinée et finale. L'un des secrets ici est que lorsque nous sommes suffisamment proche d'un attracteur, il applique la même force depuis n'importe quelle distance. (Nous ne voulons pas que la force soit plus grande ou plus petite si le joueur saute !), MAIS lorsque nous sommes suffisamment proches de plusieurs attracteurs, nous les mélangeons ensemble harmonieusement.

alt text

Attracteurs

Nous avons donc besoin d'une liste d'attracteurs utilisables pour notre Level Design. Vous pouvez voir cette liste ci-dessous. Les 2 fonctions importantes dont nous avons besoin sont ClosestPointTo() et IsInsideShape(). Kugle est littéralement construit à partir de ces 2 fonctions : la première permet de calculer le point le plus proche d'un Attracteur vers un Graviton. Une fois ce point calculé, nous avons un vecteur que nous pouvons utiliser dans notre moteur physique pour calculer la gravité. IsInsideShape() est utilisé comme une boîte de déclenchement pour de nombreux événements dans le jeu.

alt text

Ex. : Attracteur cylindrique

alt text

Regardez cette primitive cylindrique : ici vous pouvez voir un graviton en orbite autour d'un attracteur cylindrique. Cette forme est composée de 3 parties :

  • le tronc du cylindre,
  • l'extrémité du disque supérieur ou inférieur
  • l'intérieur du disque supérieur ou inférieur

Permettez-moi d'être généreux : voici le secret qui fait réellement fonctionner tout le jeu Kugle : en Level Design, une forme comme celle-là ne fonctionne jamais vraiment seule, nous avons souvent besoin de supprimer la gravité vers la partie supérieure ou inférieure de la forme, peut-être appliquer un rayon min / max. Voici un exemple d'application de restrictions à un cube :

alt text

Voilà ! Avec de nombreuses primitives à notre disposition, et quelques outils, nous sommes capables de créer un jeu avec bien plus de potentiel que Mario Galaxy !

alt text

Performance

Pour montrer en détail le résultat de plusieurs attracteurs combinés, voici un exemple de la façon dont IsInsideShape() est utilisé pour optimiser le jeu, en le découpant en plusieurs sous-niveaux pour la performance : alt text alt text alt text

Voilà ! Il y a bien sûr beaucoup plus que nous ne pouvons couvrir. Si vous souhaitez en savoir plus, venez nous parler sur Discord !